package pe.gob.osce.sirenas.wd.jsf.bean.publica;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.ResourceBundle;

import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import org.primefaces.context.RequestContext;




import pe.gob.osce.sirenas.model.BusquedaFichaDTO;
import pe.gob.osce.sirenas.model.ComunicacionesDTO;
import pe.gob.osce.sirenas.model.DistritoDTO;
import pe.gob.osce.sirenas.model.FichaArbitralDTO;
import pe.gob.osce.sirenas.model.HojaVidaDTO;
import pe.gob.osce.sirenas.model.PersonaDTO;
import pe.gob.osce.sirenas.model.ProvinciaDTO;
import pe.gob.osce.sirenas.model.RegionDTO;
import pe.gob.osce.sirenas.svc.BusquedaFichaArbitralAdminServiceLocal;
import pe.gob.osce.sirenas.svc.ObtenerDatosComunesServiceLocal;
import pe.gob.osce.sirenas.svc.RegistrarDatosPersonalesServiceLocal;
import pe.gob.osce.sirenas.svc.RegistrarFichaArbitroServiceLocal;
import pe.gob.osce.sirenas.util.ModeloException;
import pe.gob.osce.sirenas.util.NegocioException;
import pe.gob.osce.sirenas.wd.util.ConstanteWeb;
import pe.gob.osce.sirenas.wd.util.RepositorioDatos;
import pe.gob.osce.sirenas.wd.util.UBaseManage;
import org.apache.log4j.Logger;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.export.JRPdfExporterParameter;



@ManagedBean(name="datosPersonalesPublicaBean")
@SessionScoped
public class DatosPersonalesPublicaBean extends UBaseManage implements Serializable{
	
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -1053017411743374379L;

	/**
	 * Resumen.	Metodo que iniciliza la bandeja de evaluacion de quejas
	 * @return cadena mapeada para la navegacion, tipo String.
	 */
	@EJB
	private	BusquedaFichaArbitralAdminServiceLocal	busquedaFichaArbitralAdminLocal;
	@EJB
	private	RegistrarFichaArbitroServiceLocal	registrarFichaArbitroService;
	@EJB
	private	RegistrarDatosPersonalesServiceLocal	registrarDatosPersonalesService;	
	
	@EJB
	private	ObtenerDatosComunesServiceLocal	obtenerDatosComunesService;	
	
	ResourceBundle propSirenas = ResourceBundle.getBundle(ConstanteWeb.PROPERTIES);
	
	private RepositorioDatos repositorio;
	private RequestContext context;
	
	private	PersonaDTO persona;
	private FichaArbitralDTO fichaArbitralDTO;
	private	List<PersonaDTO> listPersona;
	private BusquedaFichaDTO busquedaFicha;
	private List<BusquedaFichaDTO> listBusquedaFicha;
	private List<BusquedaFichaDTO> listGenerarFisca;
	private List<BusquedaFichaDTO> listBusquedaFichaPersona;
	private List<BusquedaFichaDTO> listaFichasTemporal;
	private BusquedaFichaDTO FichasEnProcesoNotificacion;
	private List<BusquedaFichaDTO> listaFichasANotificar;
	
	/** Declaraciones objeto datos Personales */	
	
	private	ComunicacionesDTO comunicaciones;
	private	ComunicacionesDTO comunicaciones2;
	private	ComunicacionesDTO comunicaciones3;
	private	ComunicacionesDTO comunicaciones4;
	
	private	boolean verComunicacion;
	private	boolean verComunicacion2;
	private	boolean verComunicacion3;
	private	boolean verComunicacion4;
	private	HojaVidaDTO hojaVidaActiva;
	private	HojaVidaDTO hojaVidaNueva;
	List<HojaVidaDTO> listaHojaVidaDTO;
	
	
	private List<RegionDTO> listRegion=null;
	private List<ProvinciaDTO> listProvincia=null;
	private List<DistritoDTO> listDistrito=null;
	 /****Fin de Declaraciones */

	private void inicialidadObjetos()
	{
		this.persona= new PersonaDTO();
		this.busquedaFicha= new BusquedaFichaDTO();
		this.listBusquedaFicha = new ArrayList<BusquedaFichaDTO>();
		this.listGenerarFisca= new  ArrayList<BusquedaFichaDTO>();	
		this.listBusquedaFichaPersona= new ArrayList<BusquedaFichaDTO>();
	}
	
	
	/**  Secccion Datos Personales **/
	public String verRegistroDatosPersonales() throws Exception {
		System.out.println("Iniciacion verRegistroDatosPersonales");
		this.persona=new PersonaDTO();
		this.fichaArbitralDTO= new FichaArbitralDTO();
		this.hojaVidaActiva= new HojaVidaDTO();
		this.hojaVidaNueva= new HojaVidaDTO();
		this.listaHojaVidaDTO=new ArrayList<HojaVidaDTO>();
		this.verComunicacion=false;
		this.verComunicacion2=false;
		this.verComunicacion3=false;
		this.verComunicacion4=false;
		
		this.listRegion = new ArrayList<RegionDTO>();
		try {
			this.listRegion = registrarDatosPersonalesService.listarRegion();
			this.listProvincia= new ArrayList<ProvinciaDTO>();
			this.listProvincia = registrarDatosPersonalesService.listarProvincia();
			this.listDistrito = new ArrayList<DistritoDTO>();
			this.listDistrito = registrarDatosPersonalesService.listarDistrito();

			repositorio=obtenerRepositorioDatos();
			this.fichaArbitralDTO=(FichaArbitralDTO)obtenerObjetoSession(ConstanteWeb.FICHA_REGISTRO);
		
			
			/**Inicio Carga de la Persona en Sesion*/
			PersonaDTO personaDTO=new PersonaDTO();
			personaDTO.setIdPersona(this.fichaArbitralDTO.getIdPersona());
			
			/**Realizamos la carga de los Datos de la Persona*/
			this.persona=registrarDatosPersonalesService.obtenerPersona(personaDTO);
			/**Seteamos los valores de los Indicadores de la Persona*/
			this.persona.setTipoDocumento(repositorio.getLabelParametro(this.persona.getIndTipoDocumento().longValue()));
			this.persona.setGenero(repositorio.getLabelParametro(this.persona.getIndGenero().longValue()));
			this.persona.setFechaNacimiento(formatearFecha(this.persona.getFecNacimiento()));
			
			/**Obtener detalle de Hojas de vida*/
			cargaDataHojaVida();
			
			//inicializarPersonaHistorialValidar();
			
			consultarComunicaciones();
			
			System.out.println(personaDTO.getIdPersona());

		} catch (ModeloException e) {
			setMensajeroError(propSirenas.getString(ConstanteWeb.EXC_MODELO_TITLE),e.getMessage());
		}catch (Exception e) {
			setMensajeroError(propSirenas.getString(ConstanteWeb.EXC_VISTA_TITLE),"No se Completo la Carga de Datos del Formulario");
		}
		
		return "verDatosPersonalesPublico";
	}
	
	
	private void consultarComunicaciones(){
		
		try {
			this.comunicaciones=registrarDatosPersonalesService.consultarComunicacion(this.fichaArbitralDTO.getIdPersona(),Long.parseLong(propSirenas.getString(ConstanteWeb.ID_CORREOELECTRONICO)));			
			this.comunicaciones2=registrarDatosPersonalesService.consultarComunicacion(this.fichaArbitralDTO.getIdPersona(),Long.parseLong(propSirenas.getString(ConstanteWeb.ID_TELEFONO)));			
			this.comunicaciones3=registrarDatosPersonalesService.consultarComunicacion(this.fichaArbitralDTO.getIdPersona(),Long.parseLong(propSirenas.getString(ConstanteWeb.ID_CORREOELECTRONICODOS)));			
			this.comunicaciones4=registrarDatosPersonalesService.consultarComunicacion(this.fichaArbitralDTO.getIdPersona(),Long.parseLong(propSirenas.getString(ConstanteWeb.ID_TELEFONODOS)));
			validarComunicaciones();
		
			
		} catch (Exception e) {
			this.comunicaciones= new ComunicacionesDTO();
			this.comunicaciones2= new ComunicacionesDTO();
			this.comunicaciones3= new ComunicacionesDTO();
			this.comunicaciones4= new ComunicacionesDTO();
		}
	}
	private void validarComunicaciones()
	{
		if(comunicaciones==null)		
			this.comunicaciones= new ComunicacionesDTO();	
		else
		{
			this.comunicaciones.setIndPublico(convertABoolean(this.comunicaciones.getPublico()));
			if(this.comunicaciones.isIndPublico())
				this.verComunicacion=true;
		}
			
		if(comunicaciones2==null)
			this.comunicaciones2= new ComunicacionesDTO();	
		
		else
		{
			this.comunicaciones2.setIndPublico(convertABoolean(this.comunicaciones2.getPublico()));
			if(this.comunicaciones2.isIndPublico())
				this.verComunicacion2=true;
		}
		
		if(comunicaciones3==null)
			this.comunicaciones3= new ComunicacionesDTO();	
		else
		{
			this.comunicaciones3.setIndPublico(convertABoolean(this.comunicaciones3.getPublico()));
			if(this.comunicaciones3.isIndPublico())
				this.verComunicacion3=true;
		}
		
		if(comunicaciones4==null)
			this.comunicaciones4= new ComunicacionesDTO();	
		else
		{
			this.comunicaciones4.setIndPublico(convertABoolean(this.comunicaciones4.getPublico()));
			if(this.comunicaciones4.isIndPublico())
				this.verComunicacion4=true;
		}
		
	}
	
	
	
	
	
	
	
	public boolean convertABoolean(String indicador){
		if(indicador.toUpperCase().equals("1")){
			return true;
		}else{
			return false;
		}
		
	}
	public String formatearFecha(Date fecha)
	{
			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		    String fechaformateada = sdf.format(fecha);
		    
		    return fechaformateada;
				
	
	}
	public void cargaDataHojaVida()throws Exception  {

		this.listaHojaVidaDTO=registrarDatosPersonalesService.obtenerListaHojaVida(this.persona);
		
		if(!this.listaHojaVidaDTO.isEmpty()){
			for (HojaVidaDTO hojaVidaDTO : listaHojaVidaDTO) {
				if(hojaVidaDTO.getHojaActiva()){
					this.hojaVidaActiva=hojaVidaDTO;
					break;
				}
			}
		}
	}
	
	public void verHojaVidaPDF(String nombreArchivo)throws Exception  {

		String archivoRuta=propSirenas.getString(ConstanteWeb.FS_PERSONALES)+""+nombreArchivo;
		
        File archivoPDF = new File(propSirenas.getString(ConstanteWeb.FS_PERSONALES)+""+nombreArchivo);
         try {
             byte[] archivo = new byte[(int) archivoPDF.length()];
             
        	 getSession(true).removeAttribute(ConstanteWeb.REPORTE_PDF);       
        	 FileInputStream fileInputStream = new FileInputStream(archivoPDF);
        	 fileInputStream.read(archivo);
        	 for (int i = 0; i < archivo.length; i++) {
                           System.out.print((char)archivo[i]);
        	 }
        	 getSession(true).setAttribute(ConstanteWeb.REPORTE_PDF, archivo);
        	 abrirVisorPDFPopup();
         } catch (FileNotFoundException e) {
        	 e.printStackTrace();
        	 throw new NegocioException("No se encontro el Archivo PDF");
         }catch (Exception e) { 
			  e.printStackTrace();
				throw new NegocioException("Problemas al Generar version en PDF");
         }	
	}
	
	
	public void abrirVisorPDFPopup(){
		context = RequestContext.getCurrentInstance();
		context.execute("PF('dialogVistaHojaVida').show();");
	}
	
	
	public void verPhoto(String nombreArchivo)throws Exception  {

		String archivoRuta=propSirenas.getString(ConstanteWeb.FS_PERSONALES)+""+nombreArchivo;
		
        File archivoPDF = new File(propSirenas.getString(ConstanteWeb.FS_PERSONALES)+""+nombreArchivo);
         try {
             byte[] archivo = new byte[(int) archivoPDF.length()];
             
        	 getSession(true).removeAttribute(ConstanteWeb.REPORTE_PDF);       
        	 FileInputStream fileInputStream = new FileInputStream(archivoPDF);
        	 fileInputStream.read(archivo);
        	 for (int i = 0; i < archivo.length; i++) {
                           System.out.print((char)archivo[i]);
        	 }
        	 getSession(true).setAttribute(ConstanteWeb.REPORTE_PDF, archivo);

     		context = RequestContext.getCurrentInstance();
     		context.execute("PF('dialogPhoto').show();");
        	 
         } catch (FileNotFoundException e) {
        	 e.printStackTrace();
        	 throw new NegocioException("No se encontro el Archivo PDF");
         }catch (Exception e) { 
			  e.printStackTrace();
				throw new NegocioException("Problemas al Generar version en PDF");
         }	
	}
	/*********Fin de Datos Personales ******/
	
	
	

	
	
	
	
	
	
	
	
	
	
	
	public List<BusquedaFichaDTO> getListBusquedaFicha() {
		return listBusquedaFicha;
	}
	public void setListBusquedaFicha(List<BusquedaFichaDTO> listBusquedaFicha) {
		this.listBusquedaFicha = listBusquedaFicha;
	}
	public List<BusquedaFichaDTO> getListGenerarFisca() {
		return listGenerarFisca;
	}
	public void setListGenerarFisca(List<BusquedaFichaDTO> listGenerarFisca) {
		this.listGenerarFisca = listGenerarFisca;
	}
	public List<BusquedaFichaDTO> getListBusquedaFichaPersona() {
		return listBusquedaFichaPersona;
	}
	public void setListBusquedaFichaPersona(
			List<BusquedaFichaDTO> listBusquedaFichaPersona) {
		this.listBusquedaFichaPersona = listBusquedaFichaPersona;
	}
	public BusquedaFichaDTO getBusquedaFicha() {
		return busquedaFicha;
	}
	public void setBusquedaFicha(BusquedaFichaDTO busquedaFicha) {
		this.busquedaFicha = busquedaFicha;
	}
	public List<BusquedaFichaDTO> getlistBusquedaFicha() {
		return listBusquedaFicha;
	}
	public void setlistBusquedaFicha(List<BusquedaFichaDTO> listBusquedaFicha) {
		this.listBusquedaFicha = listBusquedaFicha;
	}
	public PersonaDTO getPersona() {
		return persona;
	}
	public void setPersona(PersonaDTO persona) {
		this.persona = persona;
	}
	public List<PersonaDTO> getListPersona() {
		return listPersona;
	}
	public void setListPersona(List<PersonaDTO> listPersona) {
		this.listPersona = listPersona;
	}


	public List<BusquedaFichaDTO> getListaFichasTemporal() {
		return listaFichasTemporal;
	}


	public void setListaFichasTemporal(List<BusquedaFichaDTO> listaFichasTemporal) {
		this.listaFichasTemporal = listaFichasTemporal;
	}


	public List<BusquedaFichaDTO> getListaFichasANotificar() {
		return listaFichasANotificar;
	}


	public void setListaFichasANotificar(
			List<BusquedaFichaDTO> listaFichasANotificar) {
		this.listaFichasANotificar = listaFichasANotificar;
	}


	public BusquedaFichaDTO getFichasEnProcesoNotificacion() {
		return FichasEnProcesoNotificacion;
	}


	public void setFichasEnProcesoNotificacion(
			BusquedaFichaDTO fichasEnProcesoNotificacion) {
		FichasEnProcesoNotificacion = fichasEnProcesoNotificacion;
	}

	public ComunicacionesDTO getComunicaciones() {
		return comunicaciones;
	}

	public void setComunicaciones(ComunicacionesDTO comunicaciones) {
		this.comunicaciones = comunicaciones;
	}

	public ComunicacionesDTO getComunicaciones2() {
		return comunicaciones2;
	}

	public void setComunicaciones2(ComunicacionesDTO comunicaciones2) {
		this.comunicaciones2 = comunicaciones2;
	}

	public ComunicacionesDTO getComunicaciones3() {
		return comunicaciones3;
	}

	public void setComunicaciones3(ComunicacionesDTO comunicaciones3) {
		this.comunicaciones3 = comunicaciones3;
	}

	public ComunicacionesDTO getComunicaciones4() {
		return comunicaciones4;
	}

	public void setComunicaciones4(ComunicacionesDTO comunicaciones4) {
		this.comunicaciones4 = comunicaciones4;
	}

	public HojaVidaDTO getHojaVidaActiva() {
		return hojaVidaActiva;
	}

	public void setHojaVidaActiva(HojaVidaDTO hojaVidaActiva) {
		this.hojaVidaActiva = hojaVidaActiva;
	}

	public HojaVidaDTO getHojaVidaNueva() {
		return hojaVidaNueva;
	}

	public void setHojaVidaNueva(HojaVidaDTO hojaVidaNueva) {
		this.hojaVidaNueva = hojaVidaNueva;
	}

	
	public List<RegionDTO> getListRegion() {
		return listRegion;
	}

	public void setListRegion(List<RegionDTO> listRegion) {
		this.listRegion = listRegion;
	}

	public List<ProvinciaDTO> getListProvincia() {
		return listProvincia;
	}

	public void setListProvincia(List<ProvinciaDTO> listProvincia) {
		this.listProvincia = listProvincia;
	}

	public List<DistritoDTO> getListDistrito() {
		return listDistrito;
	}

	public void setListDistrito(List<DistritoDTO> listDistrito) {
		this.listDistrito = listDistrito;
	}


	public FichaArbitralDTO getFichaArbitralDTO() {
		return fichaArbitralDTO;
	}


	public void setFichaArbitralDTO(FichaArbitralDTO fichaArbitralDTO) {
		this.fichaArbitralDTO = fichaArbitralDTO;
	}


	public List<HojaVidaDTO> getListaHojaVidaDTO() {
		return listaHojaVidaDTO;
	}


	public void setListaHojaVidaDTO(List<HojaVidaDTO> listaHojaVidaDTO) {
		this.listaHojaVidaDTO = listaHojaVidaDTO;
	}


	public boolean isVerComunicacion() {
		return verComunicacion;
	}


	public void setVerComunicacion(boolean verComunicacion) {
		this.verComunicacion = verComunicacion;
	}


	public boolean isVerComunicacion2() {
		return verComunicacion2;
	}


	public void setVerComunicacion2(boolean verComunicacion2) {
		this.verComunicacion2 = verComunicacion2;
	}


	public boolean isVerComunicacion3() {
		return verComunicacion3;
	}


	public void setVerComunicacion3(boolean verComunicacion3) {
		this.verComunicacion3 = verComunicacion3;
	}


	public boolean isVerComunicacion4() {
		return verComunicacion4;
	}


	public void setVerComunicacion4(boolean verComunicacion4) {
		this.verComunicacion4 = verComunicacion4;
	}



	
}
